<!--
 * @Description:
 * @Author: dh
 * @Date: 2021-09-15 10:32:03
 * @LastEditors: dh
 * @LastEditTime: 2022-04-12 16:31:31
-->
<!doctype html>
<html lang="en">

<head>
	<meta charset="UTF-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<title>2、构造继承</title>
</head>
<!--
             核心：使用父类的构造函数来增强子类实例，等于是复制父类的实例属性给子类（没用到原型）

             特点：
             1.解决了原型链继承中，子类实例共享父类引用属性的问题
             2.创建子类实例时，可以向父类传递参数
             3.可以实现继承多个父类（call多个父类对象）

             缺点：
             1.实例并不是父类的实例，只是子类的实例
             2.只能继承父类的实例属性和方法，不能继承原型属性/方法
             3.无法实现函数复用，每个子类都有父类实例函数的副本，影响性能
 -->

<body>
	<script>
		function Animal(name, age) {
			this.name = name || 'Animal';
			this.age = age;
			this.sleep = function () {
				console.log(this.name + '正在睡觉！');
			};
		}
		// 原型方法
		Animal.prototype.eat = function (food) {
			console.log(this.name + '正在吃：' + food);
		};

		function Cat(name = 'Tom', age) {
			Animal.call(this, name, age);
		}

		var cat = new Cat();
		// console.log(cat.name); // Tome
		// console.log(cat.sleep()); // Tom正在睡觉！
		// console.log(cat instanceof Animal); // false
		// console.log(cat instanceof Cat); // true
	</script>
</body>

</html>
